package cli;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class XML {

	static Element racine;
	static Document document;
	static int i = 0;

	public static void init(String file) {

		SAXBuilder sax = new SAXBuilder();
		
		// Si la table est créee alors on peut l'ouvrir. Sinon, elle ne l'est pas doit et doit l'être
		try {
			document = sax.build(new File(file));
		} catch (Exception e) {
			racine = new Element("Database");
			document = new Document(racine);
		}
	}

	public static void ajoutReservationXML(
			ArrayList<Reservation> liste_reservation, String file) {

		racine = document.getRootElement();

		for (i = 0; i < liste_reservation.size(); i++) {

			String age = String.valueOf(liste_reservation.get(i).age);
			String ref_evt = String.valueOf(liste_reservation.get(i).ref_evt);
			String ref_client = String.valueOf(liste_reservation.get(i).ref_client);

			Element reservation = new Element("Reservation");
			racine.addContent(reservation);

			Element eltref_evt = new Element("Ref_evt");
			eltref_evt.setText(ref_evt);
			reservation.addContent(eltref_evt);

			Element eltref_client = new Element("Ref_client");
			eltref_client.setText(ref_client);
			reservation.addContent(eltref_client);

			Element eltnom = new Element("Nom");
			eltnom.setText(liste_reservation.get(i).nom);
			reservation.addContent(eltnom);

			Element eltprenom = new Element("Prénom");
			eltprenom.setText(liste_reservation.get(i).prenom);
			reservation.addContent(eltprenom);

			Element eltage = new Element("Age");
			eltage.setText(age);
			reservation.addContent(eltage);

			Element eltreduc = new Element("Réduction");
			eltreduc.setText(liste_reservation.get(i).reduction);
			reservation.addContent(eltreduc);

			enregistre(file);
		}
	}

	public static void ajoutHockeyXML(ArrayList<Hockey> liste_hockey, String file) {

		Element manifestation;

		racine = document.getRootElement();

		// Si le noeud Manifestation n'existe pas, alors il faut le créer
		if ((manifestation = racine.getChild("Manifestation")) == null) {
			manifestation = new Element("Manifestation");
			racine.addContent(manifestation);
		}

		for (i = 0; i < liste_hockey.size(); i++) {
					String places = String.valueOf(liste_hockey.get(i).places);
					String ref_evt = String.valueOf(liste_hockey.get(i).ref_evt);
					String prix = String.valueOf(liste_hockey.get(i).prix);

					Element hockey = new Element("Hockey");
					manifestation.addContent(hockey);

					Element eltref_evt = new Element("Ref_evt");
					eltref_evt.setText(ref_evt);
					hockey.addContent(eltref_evt);

					Element eltdate = new Element("Date");
					eltdate.setText(liste_hockey.get(i).date);
					hockey.addContent(eltdate);

					Element elth_debut = new Element("Heure_début");
					elth_debut.setText(liste_hockey.get(i).h_debut);
					hockey.addContent(elth_debut);

					Element elth_fin = new Element("Heure_fin");
					elth_fin.setText(liste_hockey.get(i).h_fin);
					hockey.addContent(elth_fin);

					Element eltprix = new Element("Prix");
					eltprix.setText(prix);
					hockey.addContent(eltprix);

					Element eltplaces = new Element("Places");
					eltplaces.setText(places);
					hockey.addContent(eltplaces);

					Element eltequipe1 = new Element("Equipe_1");
					eltequipe1.setText(liste_hockey.get(i).equipe1);
					hockey.addContent(eltequipe1);

					Element eltequipe2 = new Element("Equipe_2");
					eltequipe2.setText(liste_hockey.get(i).equipe2);
					hockey.addContent(eltequipe2);

					Element eltcompet = new Element("Competition");
					eltcompet.setText(liste_hockey.get(i).compet);
					hockey.addContent(eltcompet);

					Element eltarbitre = new Element("Abitre");
					eltarbitre.setText(liste_hockey.get(i).arbitre);
					hockey.addContent(eltarbitre);
					
					enregistre(file);
			}
	}
	
	public static ArrayList<Integer> getReferences(String dbpath){
		ArrayList<Integer> liste_refs = new ArrayList<Integer>();
		
		SAXBuilder sax = new SAXBuilder();
		try {
			document = sax.build(new File(dbpath));
		} catch (Exception e) {
			racine = new Element("Database");
			document = new Document(racine);
		}
		racine = document.getRootElement();
		Element Manif = racine.getChild("Manifestation");
		List<Element> Events = Manif.getChildren();
		Iterator<Element> i = Events.iterator();
		while(i.hasNext()){
			Element event = i.next();
			String ref_evt = event.getChildText("Ref_evt");
			if(ref_evt != null)
				liste_refs.add(Integer.parseInt(ref_evt));
		}
		return liste_refs;
	}
	
	public static ArrayList<String> getCreneaux(String dbpath){
		ArrayList<String> liste_infos = new ArrayList<String>();
		
		SAXBuilder sax = new SAXBuilder();
		try {
			document = sax.build(new File(dbpath));
		} catch (Exception e) {
			racine = new Element("Database");
			document = new Document(racine);
		}
		racine = document.getRootElement();
		Element Manif = racine.getChild("Manifestation");
		List<Element> Events = Manif.getChildren();
		Iterator<Element> i = Events.iterator();
		while(i.hasNext()){
			Element event = i.next();
			String date = event.getChildText("Date");
			String debut = event.getChildText("Heure_début");
			String fin = event.getChildText("Heure_fin");
			liste_infos.add(date);
			liste_infos.add(debut);
			liste_infos.add(fin);
		}
	
		return liste_infos;
	}
	

	public static void checkExistence(ArrayList<Concert> liste_concert)
			throws M1Exception {
		// On gère l'exception M1
		racine = document.getRootElement();
		Element manifestation = racine.getChild("Manifestation");
		/* Gérons les Exceptions éventuelles qui doivent être levées */
		List<Element> evts = manifestation.getChildren();
		Iterator<Element> i = evts.iterator();
		while (i.hasNext()) {
			String ref = i.next().getText();
			System.out.println("ref : " + ref);
			Iterator<Concert> j = liste_concert.iterator();
			while (j.hasNext()) {
				Concert concert = j.next();
				if (ref.equals(String.valueOf(concert.ref_evt))) {
					System.out.println("Trouvé !");
					throw new M1Exception("Erreur M1 : Evenement déjà existant");
				}
			}
		}

	}

	public static void ajoutConcertXML(ArrayList<Concert> liste_concert, String file) {

		Element manifestation;
		
		racine = document.getRootElement();
		
		if ((manifestation = racine.getChild("Manifestation")) == null) {
			manifestation = new Element("Manifestation");
			racine.addContent(manifestation);
		}
		/* Gérons les Exceptions éventuelles qui doivent être levées */
		List<Element> refs = manifestation.getChildren("Ref_evt");

		// La référence de l'evt n'existe pas déjà

		for (i = 0; i < liste_concert.size(); i++) {
			String places = String.valueOf(liste_concert.get(i).places);
			String ref_evt = String.valueOf(liste_concert.get(i).ref_evt);
			String prix = String.valueOf(liste_concert.get(i).prix);

			Element concert = new Element("Concert");
			manifestation.addContent(concert);

			Element eltref_evt = new Element("Ref_evt");
			eltref_evt.setText(ref_evt);
			concert.addContent(eltref_evt);

			Element eltdate = new Element("Date");
			eltdate.setText(liste_concert.get(i).date);
			concert.addContent(eltdate);

			Element elth_debut = new Element("Heure_début");
			elth_debut.setText(liste_concert.get(i).h_debut);
			concert.addContent(elth_debut);

			Element elth_fin = new Element("Heure_fin");
			elth_fin.setText(liste_concert.get(i).h_fin);
			concert.addContent(elth_fin);

			Element eltprix = new Element("Prix");
			eltprix.setText(prix);
			concert.addContent(eltprix);

			Element eltplaces = new Element("Places");
			eltplaces.setText(places);
			concert.addContent(eltplaces);

			Element eltartiste = new Element("Artiste");
			eltartiste.setText(liste_concert.get(i).artiste);
			concert.addContent(eltartiste);

			Element eltstyle = new Element("Style");
			eltstyle.setText(liste_concert.get(i).style);
			concert.addContent(eltstyle);

			enregistre(file);

		}
	}

	public static void ajoutPatinageXML(ArrayList<Patinage> liste_patinage, String file) {

		Element manifestation;
		
		racine = document.getRootElement();
		
		if ((manifestation = racine.getChild("Manifestation")) == null) {
			manifestation = new Element("Manifestation");
			racine.addContent(manifestation);
		}

		for (i = 0; i < liste_patinage.size(); i++) {

			String prix = String.valueOf(liste_patinage.get(i).prix);

			Element concert = new Element("Patinage");
			manifestation.addContent(concert);

			Element eltdate = new Element("Date");
			eltdate.setText(liste_patinage.get(i).date);
			concert.addContent(eltdate);

			Element elth_debut = new Element("Heure_début");
			elth_debut.setText(liste_patinage.get(i).h_debut);
			concert.addContent(elth_debut);

			Element elth_fin = new Element("Heure_fin");
			elth_fin.setText(liste_patinage.get(i).h_fin);
			concert.addContent(elth_fin);

			Element eltprix = new Element("Prix");
			eltprix.setText(prix);
			concert.addContent(eltprix);
			
			enregistre(file);
		}
	}

	static void affiche() {
		try {
			// On utilise ici un affichage classique avec getPrettyFormat()
			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
			sortie.output(document, System.out);
		} catch (java.io.IOException e) {
		}
	}

	static void enregistre(String fichier) {
		try {
			// On utilise ici un affichage classique avec getPrettyFormat()
			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
			// Remarquez qu'il suffit simplement de créer une instance de
			// FileOutputStream
			// avec en argument le nom du fichier pour effectuer la
			// sérialisation.
			sortie.output(document, new FileOutputStream(fichier));
		} catch (java.io.IOException e) {
		}
	}

	public Element getRootofFile(String file) {

		SAXBuilder sax = new SAXBuilder();

		try {
			// On cr�e un nouveau document JDOM avec en argument le fichier XML
			// Le parsing est termin� ;)
			document = sax.build(new File(file));
		} catch (Exception e) {
		}

		racine = document.getRootElement();

		return racine;

	}

	public ArrayList<Element> getManifs(Element root) {
		ArrayList<Element> manifs = new ArrayList<Element>();

		List<Element> manifestation = root.getChild("Manifestation")
				.getChildren();
		Iterator<Element> i = manifestation.iterator();
		while (i.hasNext()) {
			Element current = i.next();
			manifs.add(current);
		}

		return manifs;
	}

	public void getHockey(Element root) {

		Element manifs = root.getChild("Manifestation");
		List<Element> hockey = manifs.getChildren("Hockey");
		Iterator<Element> i = hockey.iterator();

		while (i.hasNext()) {

			Element courant = (Element) i.next();

			List<Element> details = courant.getChildren();

			Iterator<Element> j = details.iterator();
			while (j.hasNext()) {
				Element current = (Element) j.next();
				System.out.println(current.getText());
			}
		}

	}

	public ArrayList<Element> getConcert(Element root) {

		ArrayList<Element> concerts = new ArrayList<Element>();

		Element manifs = root.getChild("Manifestation");
		List<Element> concert = manifs.getChildren("Concert");
		Iterator<Element> i = concert.iterator();

		while (i.hasNext()) {

			Element courant = (Element) i.next();
			concerts.add(courant);

			/*
			 * List<Element> details = courant.getChildren();
			 * 
			 * Iterator<Element> j = details.iterator(); while (j.hasNext()) {
			 * Element current = (Element) j.next();
			 * System.out.println(current.getText()); }
			 */
		}

		return concerts;

	}

	public static ArrayList<Element> getResa(String file) {

		Element root;
		
		SAXBuilder sax = new SAXBuilder();

		try {
			document = sax.build(new File(file));
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		root = document.getRootElement();

		ArrayList<Element> liste = new ArrayList<Element>();

		List<Element> reservations = root.getChildren("Reservation");
		Iterator<Element> i = reservations.iterator();
		while (i.hasNext()) {
			Element current = i.next();
			liste.add(current);
		}

		return liste;
	}

	/*public Element getEventFromId(String id, String file) {

		Element root;

		SAXBuilder sax = new SAXBuilder();

		try {
			document = sax.build(new File(file));
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		root = document.getRootElement();

		Element manifestations = root.getChild("Manifestation");

		List<Element> allmanifs = manifestations.getChildren();
		Iterator<Element> i = allmanifs.iterator();
		while (i.hasNext()) {
			Element current = i.next();

			// On est donc sur un concert ou un match
			// On regarde si la balise Ref_evt correspondante est celle que l'on
			// cherche

			String Ref = current.getChildText("Ref_evt");
			if (Ref.equals(id)) {
				return current;
			}
		}

		return root;

	}*/

	public boolean checkRef(Element root, String reference) {
		
		Element manif = root.getChild("Manifestation");
		List<Element> events = manif.getChildren();
		Iterator<Element> i = events.iterator();
				
		while (i.hasNext()) {
			String ref = i.next().getChildText("Ref_evt");
			if(ref != null){
				if (reference.equals(ref)) {
					return true;
				}
			}
		}
		return false;

	}
	
	public String getDatefromRef(Element root, String reference){
		String date_evt=null;
		Element manif = root.getChild("Manifestation");
		List<Element> events = manif.getChildren();
		Iterator<Element> i = events.iterator();
				
		while (i.hasNext()) {
			Element courant = i.next();
			String ref = courant.getChildText("Ref_evt");
			if(ref != null){
				if (reference.equals(ref)) {
					date_evt = courant.getChildText("Date");
				}
			}
		}
		return date_evt;
	}
	
	

	public boolean enoughPlaces(Element root, Integer ref) {

		int nb_places;
		String nb_places_max = new String();
		int compteur = 0;
		String nb_resa;
		// Lire le nombre de places max pour l'evenement ref
		Element manif = root.getChild("Manifestation");
		List<Element> events = manif.getChildren();
		Iterator<Element> i = events.iterator();
		while (i.hasNext()) {
			Element event = i.next();
			// Pour cet �v�nement on regarde si la ref correspond

			String reference = event.getChildText("Ref_evt");
			if (reference != null) {
				if (Integer.parseInt(reference) == ref) {
					Element places = event.getChild("Places");
					nb_places_max = places.getText();
					break;
				}
			}
		}

		// Lire le nombre de r�servations d�j� en place pour un �v�nement ref

		List<Element> reservations = root.getChildren("Reservation");
		Iterator<Element> j = reservations.iterator();
		while (j.hasNext()) {
			Element elt = j.next();
			if (elt.getChildText("Ref_evt").equals(String.valueOf(ref))) {
				compteur++;
			}
		}

		// Faire la diff
		if (compteur < Integer.parseInt(nb_places_max))
			return true;
		else
			return false;

	}
}
